package xutil

import (
	"archive/zip"
	"fmt"
	"io"
	"os"
	"path"
	"path/filepath"
	"strings"
)

func F打包目录(src_dir string, zip_file_name string) {

	// 预防：旧文件无法覆盖
	os.RemoveAll(zip_file_name)

	// 创建：zip文件
	zipfile, _ := os.Create(zip_file_name)
	defer zipfile.Close()

	// 打开：zip文件
	archive := zip.NewWriter(zipfile)
	defer archive.Close()

	// 遍历路径信息
	filepath.Walk(src_dir, func(path string, info os.FileInfo, _ error) error {

		// 如果是源路径，提前进行下一个遍历
		if path == src_dir {
			return nil
		}

		// 获取：文件头信息
		header, _ := zip.FileInfoHeader(info)
		header.Name = strings.TrimPrefix(path, src_dir+`/`)

		// 判断：文件是不是文件夹
		if info.IsDir() {
			header.Name += `/`
		} else {
			// 设置：zip的文件压缩算法
			header.Method = zip.Deflate
		}

		// 创建：压缩包头部信息
		writer, _ := archive.CreateHeader(header)
		if !info.IsDir() {
			file, _ := os.Open(path)
			defer file.Close()
			io.Copy(writer, file)
		}
		return nil
	})
}

func F新打包目录(src_dir string, pathname string, 是否铺平 ...int) {
	// 预防：旧文件无法覆盖
	os.RemoveAll(pathname)

	// 创建：zip文件
	zipfile, _ := os.Create(pathname)
	defer zipfile.Close()

	// 打开：zip文件
	archive := zip.NewWriter(zipfile)
	defer archive.Close()

	// 遍历路径信息
	filepath.Walk(src_dir, func(path string, info os.FileInfo, _ error) error {
		//fmt.Println("srcdir", src_dir, "path", path)
		// 如果是源路径，提前进行下一个遍历
		if path == src_dir {
			return nil
		}

		if info.Name() == pathname {
			return nil
		}
		if filepath.Ext(info.Name()) == filepath.Ext(pathname) {
			return nil
		}
		// 获取：文件头信息
		header, _ := zip.FileInfoHeader(info)
		if len(是否铺平) == 0 {
			header.Name = path
		} else {
			header.Name = filepath.Base(path)
		}
		//header.Name = strings.TrimPrefix(path, src_dir)
		// 判断：文件是不是文件夹
		if info.IsDir() {
			header.Name += `/`
		} else {
			// 设置：zip的文件压缩算法
			header.Method = zip.Deflate
		}

		// 创建：压缩包头部信息
		writer, _ := archive.CreateHeader(header)
		if !info.IsDir() {
			file, _ := os.Open(path)
			defer file.Close()
			io.Copy(writer, file)
		}
		return nil
	})
}

// 传文件路径与名字，会直接在路径的目录压缩并删除原文件
func F单独压缩一个文件(pat string) {
	fileNameWithSuffix := path.Base(pat)
	//fmt.Println("fil", fileNameWithSuffix)
	pat1 := strings.TrimSuffix(pat, path.Ext(pat)) + ".zip"
	zipfile, _ := os.Create(pat1)
	defer zipfile.Close()

	// 打开：zip文件
	archive := zip.NewWriter(zipfile)
	defer archive.Close()

	w1, err := archive.Create(fileNameWithSuffix)
	if err != nil {
		fmt.Println("压缩文件异常", err.Error())
		return
	}

	f1, err := os.Open(pat)
	if err != nil { //如果文件不存在，这里会报错
		return
	}
	if _, err := io.Copy(w1, f1); err != nil {
		fmt.Println("压缩文件异常", err.Error())
	}
	f1.Close()
	//删除文件
	err = os.RemoveAll(pat)
	if err != nil {
		fmt.Println("err", err.Error())
	}
}
